package com.aiapphub.BaseCode.utils;

import org.bouncycastle.jce.provider.BouncyCastleProvider;

import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
import java.security.Security;
import javax.crypto.Cipher;

/**
 * AES加密工具类（使用Bouncy Castle提供PKCS7Padding支持）
 */
public class EncryptUtil {
    // 静态代码块注册BouncyCastle安全提供者
    static {
        Security.addProvider(new BouncyCastleProvider());
    }

    /**
     * AES加密方法（CBC模式，PKCS7填充）
     * @param data 明文数据
     * @param key  AES密钥（16/24/32字节）
     * @param iv   初始向量（16字节）
     * @return Base64编码的加密结果
     */
    public static String encrypt(String data, String key, String iv) throws Exception {
        // 构建密钥规范
        SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), "AES");
        // 构建初始向量
        IvParameterSpec ivSpec = new IvParameterSpec(iv.getBytes());
        // 获取加密实例（明确指定提供者防止不同环境差异）
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding", "BC");
        cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);
        // 执行加密并Base64编码
        byte[] encrypted = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8));
        return Base64.getEncoder().encodeToString(encrypted);
    }

    /**
     * AES解密方法
     * @param encryptedData Base64编码的加密数据
     * @param key           AES密钥
     * @param iv            初始向量
     * @return 解密后的明文
     */
    public static String decrypt(String encryptedData, String key, String iv) throws Exception {
        SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), "AES");
        IvParameterSpec ivSpec = new IvParameterSpec(iv.getBytes());
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding", "BC");
        cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
        // Base64解码后解密
        byte[] decoded = Base64.getDecoder().decode(encryptedData);
        byte[] decrypted = cipher.doFinal(decoded);
        return new String(decrypted, StandardCharsets.UTF_8);
    }
}